# -*- coding: ISO-8859-1 -*-
import sys
import socket
import time
import thread
import threading
class client():

    #faz a conexão com o server
    def __init__(self,serverHost):
        global LASTCOMMAND
        global COMMANDSTATUS
        self.serverHost = serverHost
        self.serverPort= 50018
        self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    	self.connection.connect((self.serverHost, self.serverPort))
        LASTCOMMAND = ''
        COMMANDSTATUS = ''

    #base para comunicaçao e comandos enviados ao server
    def EnviaComandoServer(self,command,MSG_OK,MSG_ERR):
        global COMMANDSTATUS
        self.command = command
        self.connection.send(self.command)
        self.data = self.connection.recv(1024)
        if self.data.strip() == 'OK':
            print MSG_OK
            COMMANDSTATUS = 'OK'
            return 1
        elif self.data == 'ERR':
            print MSG_ERR
            COMMANDSTATUS = 'ERR'
            return 0

    #envia um REGISTER para o servidor, caso não se conecta envia um QUIT
    def Register(self):
        self.EnviaComandoServer('REGISTER','Registrado no Server\n','erro na conexão ou cliente já registrado\n')

    #envia um QUIT para o servidor
    def Quit(self):
        self.Remove()
        if self.EnviaComandoServer('QUIT','Conexão encerrada\n','o servidor não entendeu a sua requisiçao\n'):
            sys.exit(0)

    #envia um REMOVE para o servidor
    def Remove(self):
        self.EnviaComandoServer('REMOVE','Removido da lista do servidor\n','não foi possível atender a sua requisição ou seu cliente não está registrado\n')

    #envia um LIST para o servidor    
    def List(self):
        self.EnviaComandoServer('LIST','Obtendo a lista de sources do servidor...\n','não foi possível obter uma lista de sources\n')

    #envia um START para o servidor
    def Start(self):
        self.EnviaComandoServer('START','Obtendo Vídeo do servdor\n','Não foi possível receber um vídeo\n')

    #envia um STOP para o servidor
    def Stop(self):
        self.EnviaComandoServer('STOP','Parada a transmissão de vídeo\n','Servidor não entendeu a sua requisiçao\n')

    #base para menu principal
    def MainLoop(self):
        #temporário, preciso melhorar isso
        self.Register()
        try:
               self.Option()
        except KeyboardInterrupt:
            self.Quit()

    #while enquanto le opções
    def Option(self):
        global COMMAND
        option = 100
        while option != 0:           
            print "Escolha uma das opções abaixo\n"
            print "1 - REGISTER\n"
            print "2 - LIST\n"
            print "3 - START\n"
            print "4 - STOP\n"
            print "5 - REMOVE\n"
            print "0 - QUIT\n"

            option = int(raw_input('Selecione um número: '))

            if option == 1:
                COMMAND = 'self.Register()'
                self.ExecCommand()
            elif option == 2:
                COMMAND = 'self.List()'
                self.ExecCommand()
            elif option == 3:
                COMMAND = 'self.Start()'
                self.ExecCommand()
            elif option == 4:
                COMMAND = 'self.Stop()'
                self.ExecCommand()
            elif option == 5:
                COMMAND = 'self.Remove()'
                self.ExecCommand()
            else:
                print 'Digite uma opção válida\n'
        #tá dando erro quando eh executado depois do stop, preciso debugar isso 
        COMMAND = 'self.Quit()'
        self.ExecCommand()
 
    #vai ser uma thread para ler o que tem em COMMAND e executar...
    def ExecCommand(self):
        #preciso colocar uma FLAG aqui para comparar se o comando atual é diferente do ultimo
        #se for igual preciso saber também se ele foi recebeu OK ou ERR
        #só executar o mesmo comando se for ERR a ultima resposta

        global COMMAND
        global LASTCOMMAND
        #preciso melhorar estas flags...
        if LASTCOMMAND != COMMAND or (LASTCOMMAND == COMMAND and COMMANDSTATUS == 'ERR'):
            print COMMANDSTATUS + 'eh a ultima chamada ao programa'
            exec(COMMAND)
        else:
            print COMMANDSTATUS + 'eh a ultima chamada ao programa'
            print 'Escolha um Comando diferente'
        LASTCOMMAND = COMMAND

SEMAFORO = threading.Semaphore()
cliente = client(sys.argv[1])  

thread.start_new_thread(cliente.MainLoop(),())
thread.start_new_thread(cliente.ExecCommand(),())
